package com.guli.common.utils;
/*
 * @Author 罗
 * @date 2020/9/23 - 6:46 上午
 */

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.BeanWrapper;
import org.springframework.beans.BeanWrapperImpl;

import java.util.ArrayList;
import java.util.List;

public class CopyPageProperties {
    /**
     * 拷贝page<T>对象到一个新的page<R>对象中
     * 底层使用 BeanUtils.copyProperties(record, r); 实现
     * */
    public static <T, R> Page<R> copy(IPage<T> source, Class<R> c) {

        Page<R> target = new Page<>();

        // 因为创建Page对象的时候，records 属性为null，所以要手动赋值
        target.setRecords(new ArrayList<R>((int) source.getSize()));

        // 获取目标records，准备添加数据
        List<R> targetList = target.getRecords();

        for (T record : source.getRecords()) {

            /**
             * 还不能放在for循环外面，不然拷贝的集合中的元素就都是同一对象
             * */
            R r = null;
            try {
                // 通过反射来实例化对象
                r = c.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                throw new RuntimeException(c.getName() + "不能通过反射来实例化");
            }

            // 拷贝对象
            BeanUtils.copyProperties(record, r);

            // 将拷贝好的对象添加到目标records中
            targetList.add(r);
        }

        target.setTotal(source.getTotal());

        return target;
    }

}
